import json

import numpy as np
import pandas as pd
import yaml

from yaml import SafeLoader

from datareport.api import ImageUtil, ConfigClass
from datareport.api.DataSource import DataSource
from datareport.api.annotation.Font import Font
from datareport.api.enum.ColorEnum import ColorEnum
from datareport.impl.paragraph.base.BaseParagraph import BaseParagraph
from datareport.api.annotation.Style import style


@style()
class KaiZhanQingKuang_zhiliangpinjia_dangzhibu_53(BaseParagraph):
    """
    本年度校级组织生活 开展质量评价-整体
     对 教 师 党 支 部 和 学 生 党 支 部 的 分 类 评 价 来 看 ，\
教 师 党 支 部 整 体 得 分 高 于 学 生 党 支 部 。 具 体 情 况 如 下 表 。
    """

    def __init__(self):
        super().__init__()
        self.fonts=[
            Font(text='3 、 从 被 观 摩 党 支 部 来 看 ： 共 有 '.replace(' ','')),
            Font(text='个 党 支 部 得 分 为 满 分 ，'.replace(' ',''),bold=True)
                    ]

        self.sort = 42
        self.section = 17

    def plot(self, df, plt):
        pass

    def getData(self, result):
        pass

    def start(self, conn, year, plt):
        conn1 = DataSource(ConfigClass.data['datasource1']).conn
        df = pd.read_sql('''select topic16,p.partyBranchName,p.partyOrgName 
        from t_observerRecord r 
        inner join t_meetingPlan p 
        on r.activityId=p.activityId
        where topic16 is not null and year(r.createTime)={} and isObserve=1'''.format(year), con=conn)
        dzz=pd.read_sql('''select name,党支部类型 from v_dzzinfo''',con=conn1)
        ##
        record_df = pd.DataFrame(columns=['二级党组织', '党支部', '综合得分', '工作体现程度', '可借鉴情况'])
        df = parser(record_df, df)
        df['评价表数量'] = 1
        jc_df = df.groupby(['二级党组织','党支部']).agg({'综合得分': 'mean', '工作体现程度': 'mean', '可借鉴情况': 'mean', '评价表数量': 'sum'}).reset_index(drop=False)

        jc_df['isfive']=jc_df['综合得分'].apply(lambda x:1 if x==5 else 0)
        ## 二级党组织下党支部5分的分布
        five_df=jc_df.groupby('二级党组织')['isfive'].sum()
        self.image=ImageUtil.plot(five_df.reset_index(drop=False),ylable='5分党支部分布')
        ## 党支部5分
        five_jc_df=jc_df[jc_df['综合得分'] == 5]
        five_jc_df['stu'] = five_jc_df['党支部'].apply(lambda x: isStu(x, dzz))
        five_jc_df['tea'] = five_jc_df['党支部'].apply(lambda x: isTea(x, dzz))

        self.fonts.append(Font(text='''其 中 教 师 党 支 部 占 比 {}％ ，学 生 党 支 部 占 比 {}％ 。 各 二 级 党 组 织 分 布 情 况 如 图 。'''
             .replace(' ', '').format(round(100*five_jc_df['tea'].mean(),1) if len(five_df)>0 else 0,round(100*five_jc_df['stu'].mean(),1) if len(five_df)>0 else 0))
)
        temp=five_jc_df['党支部'].values
        if len(temp)%2==1:
            temp=np.append(temp,'')
        res = temp.reshape(-1, 2)
        table = pd.DataFrame(columns=['5分党支部名称', '5分党支部名称'], data=res)
        ## 文本内容
        self.fonts.insert(1,Font(text=str(len(jc_df[jc_df['综合得分'] == 5])),bold=True))
        self.tables.append(jc_df[['二级党组织', '党支部', '综合得分', '工作体现程度', '可借鉴情况','评价表数量']].round(2))
        self.tables.append(table)
def isStu(x,dzz):
    if ('本专科生' in dzz[dzz['name']==x]['党支部类型'].values[0]) \
        or ('研究生' in dzz[dzz['name']==x]['党支部类型'].values[0]):
        return 1
    else:
        0

def isTea(x,dzz):
    if ('教职工' in dzz[dzz['name']==x]['党支部类型'].values[0]) :
        return 1
    else:
        0


def parser(record_df, df):
    for i in np.arange(len(df)):
        record = json.loads(df.iloc[i]['topic16'])
        ## 工作体现程度
        workReflection = 0
        ## 借鉴情况
        reference = 0
        ## 综合得分
        overall = 0
        for b in record[0]['body']:
            workReflection += b['value'] / len(record[0]['body'])
            overall += b['value'] / (len(record[0]['body']) + len(record[1]['body']))
        for b in record[1]['body']:
            reference += b['value'] / len(record[1]['body'])
            overall += b['value'] / (len(record[0]['body']) + len(record[1]['body']))
        record_df = record_df.append({'二级党组织': df.iloc[i]['partyOrgName'], '党支部': df.iloc[i]['partyBranchName'],
                                      '综合得分': overall, '工作体现程度': workReflection, '可借鉴情况': reference}, ignore_index=True)
    return record_df


def list2str(l):
    return '、'.join(l)


if __name__ == '__main__':
    with open('D:\work\sanhuiyike\datareport\config.yaml', encoding='utf-8') as f:
        data = yaml.load(f, Loader=SafeLoader)
    con = DataSource(data['datasource']).conn
    KaiZhanQingKuang_zhiliangpinjia_dangzhibu_53().start(con, 2023, '')
